# Copyright (C) 2026. Logiciel élaboré par l'État, via le DEPS.
# Nom des auteures : Flore Cornuet et Camille Parent, DEPS.
# Ce programme informatique a été développé par le DEPS.
# Il permet de produire les résultats du Culture Études 1-2026.

# Ce programme a été exécuté en septembre 2026 avec la version 4.5.3 de R.
# La publication peut être consultée sur le site du Deps. 
# Ce programme utilise les données du pass Culture et du recensement de la population 2022.

# Bien qu'il n'existe aucune obligation légale à ce sujet, les utilisateurs de ce programme sont
# invités à signaler au DEPS leurs travaux issus de la réutilisation de ce code, ainsi que les
# éventuels problèmes ou anomalies qu'ils y rencontreraient, en écrivant à contact.deps@culture.gouv.fr .
# Ce logiciel est régi par la licence EUPL V1.2 soumise au droit français et européen, respectant
# les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer
# ce programme sous les conditions de la licence EUPL V1.2, telle que diffusée sur
# https://eupl.eu/1.2/fr/ .
# En contrepartie de l'accessibilité au code source et des droits de copie, de modification et de
# redistribution accordés par cette licence, il n'est offert aux utilisateurs qu'une garantie
# limitée. Pour les mêmes raisons, seule une responsabilité restreinte pèse sur les auteures du
# programme, le titulaire des droits patrimoniaux et les concédants successifs.
# À cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à
# l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par
# l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à
# manipuler et qui le réserve donc à des développeurs et des professionnels avertis possédant des
# connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester
# l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de
# leurs systèmes et ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les
# mêmes conditions de sécurité.


# chargement des packages ####

library(data.table)
library(tidyverse)
library(arrow)
library(readxl)
library(ggplot2)
library(duckdb)
library(DBI)
library(glue)
library(ggplot2)
library(scales)
library(ggplot2)


# Connexion DuckDB ####

con <- dbConnect(duckdb())
dbExecute(con, "SET threads = 4")
dbExecute(con, "SET preserve_insertion_order = false")
dbExecute(con, "SET memory_limit = '16GB'")

# chargement des tables ####

tab_finale <- read_parquet(paste0(chemin_intermediaires, "tab_finale.parquet"))
tab_cat <- read_parquet(paste0(chemin_intermediaires, "tab_cat.parquet"))
setDT(tab_finale)

duckdb_register_arrow(con, "user_tbl", open_dataset(paste0(
  chemin_donnees, "exp_ministry__user/"
)))
# filtre nés en 2003-2005

# distribution ####

# il faut remonter à la table non agrégée

duckdb_register_arrow(con, "deposit", open_dataset(paste0(
  chemin_donnees, "exp_ministry__deposit/"
)))

dist <- dbGetQuery(
  con,
  paste0(
    "
  SELECT
    b.user_id,
    SUM(b.booking_intermediary_amount) AS depense_user
  FROM read_parquet('", chemin_booking, "') b
  INNER JOIN (
    SELECT deposit_id
    FROM deposit
    WHERE deposit_amount = 300
      AND deposit_creation_date >= '2021-05-21'
      AND deposit_creation_date <  '2025-02-28'
      AND deposit_expiration_date < '2025-02-28'
      AND user_id IN (
        SELECT user_id FROM user_tbl
        WHERE user_birth_date >= '2003-01-01' AND user_birth_date < '2006-01-01'
      )
  ) d ON b.deposit_id = d.deposit_id
  WHERE b.booking_creation_date < '2025-02-28'
    AND b.booking_status IN ('used', 'reimbursed')
    AND b.booking_intermediary_amount > 0
  GROUP BY b.user_id
"
  )
) |> as.data.table()


# pour exporter sur excel ####

# tranches de 10 €, comme binwidth = 10
dist[, tranche := cut(depense_user,
                      breaks = seq(0, 440, 10),
                      right = FALSE,           # [0,10), [10,20)... comme ggplot
                      include.lowest = TRUE)]

tab_histo <- dist[, .(nb = .N), by = tranche][order(tranche)]
tab_histo[, part_pct := round(nb / sum(nb) * 100, 2)]

# borne inférieure de chaque tranche, pour l'axe x dans Excel
tab_histo[, borne_min := seq(0, 430, 10)[.I]]

tab_histo

write.table(tab_histo, "clipboard-256", sep = "\t", row.names = FALSE, dec = ",")


# combien ont dépensé 0€ ?

dbGetQuery(con, glue("
  WITH benef AS (
    SELECT DISTINCT dep.user_id, dep.deposit_id
    FROM read_parquet('{chemin_donnees}exp_ministry__deposit/*.parquet') dep
    WHERE dep.deposit_amount = 300
      AND dep.deposit_creation_date >= '2021-05-21'
      AND dep.deposit_creation_date <  '2025-02-28'
      AND dep.deposit_expiration_date < '2025-02-28'
      AND dep.user_id IN (
        SELECT user_id FROM user_tbl
        WHERE user_birth_date >= '2003-01-01' AND user_birth_date < '2006-01-01'
      )
  ),
  depensiers AS (
    SELECT DISTINCT b.deposit_id
    FROM read_parquet('{chemin_booking}') b
    WHERE b.booking_creation_date < '2025-02-28'
      AND b.booking_status IN ('used', 'reimbursed')
      AND b.booking_intermediary_amount > 0
  )
  SELECT
    COUNT(DISTINCT benef.user_id)                                          AS nb_benef,
    COUNT(DISTINCT CASE WHEN d.deposit_id IS NULL THEN benef.user_id END)  AS nb_non_depensiers,
    COUNT(DISTINCT CASE WHEN d.deposit_id IS NULL THEN benef.user_id END) * 1.0 /
      COUNT(DISTINCT benef.user_id)                                        AS part_non_depensiers
  FROM benef
  LEFT JOIN depensiers d ON benef.deposit_id = d.deposit_id
"))